/**
 * 获取传入值的类型
 * @param {*} value - 任何值
 * @returns {string} - 返回值的类型名称，如 "String", "Object", "Array"
 */
const getValueType = (value) => {
    const type = Object.prototype.toString.call(value)
    return type.slice(8, -1)
  }
  
  /**
   * 自定义封装的 Storage 操作工具
   * @param {'sessionStorage' | 'localStorage'} type - 指定使用 sessionStorage 或 localStorage，默认 sessionStorage
   * @returns {object} - 返回四个操作方法：setStorage, getStorage, removeStorage, clear
   */
  export const useStorage = (type = 'sessionStorage') => {
    /**
     * 设置缓存
     * @param {string} key - 存储的键名
     * @param {*} value - 存储的值（支持任何类型）
     */
    const setStorage = (key, value) => {
      const valueType = getValueType(value)
      // 以 JSON 格式存储，包含类型和值，方便取出时区分类型
      window[type].setItem(key, JSON.stringify({ type: valueType, value }))
    }
  
    /**
     * 获取缓存
     * @param {string} key - 读取的键名
     * @returns {*} - 返回存储的值，自动解析 JSON
     */
    const getStorage = (key) => {
      const value = window[type].getItem(key)
      if (value) {
        // 解析后只返回值部分，不返回类型
        const { value: val } = JSON.parse(value)
        return val
      } else {
        return value
      }
    }
  
    /**
     * 删除指定缓存项
     * @param {string} key - 需要删除的键名
     */
    const removeStorage = (key) => {
      window[type].removeItem(key)
    }
  
    /**
     * 清除缓存，支持排除部分键名不清除
     * @param {string[]} [excludes] - 需要排除的键名数组，默认排除 ['dynamicRouter', 'serverDynamicRouter']
     */
    const clear = (excludes) => {
      // 获取当前 Storage 中所有的 key
      const keys = Object.keys(window[type])
      const defaultExcludes = ['dynamicRouter', 'serverDynamicRouter']
      const excludesArr = excludes ? [...excludes, ...defaultExcludes] : defaultExcludes
      // 过滤出需要清除的 key，排除排除项
      const keysToClear = excludesArr ? keys.filter((key) => !excludesArr.includes(key)) : keys
      // 清除所有非排除项的缓存
      keysToClear.forEach((key) => {
        window[type].removeItem(key)
      })
    }
  
    return {
      setStorage,
      getStorage,
      removeStorage,
      clear
    }
  }
  
  /**
   * 使用示例：
   * 
   * import { useStorage } from './useStorage.js'
   * 
   * const { setStorage, getStorage, removeStorage, clear } = useStorage('localStorage')
   * 
   * setStorage('user', { name: '张三', age: 18 })
   * const user = getStorage('user')  // { name: '张三', age: 18 }
   * 
   * removeStorage('user')
   * 
   * clear(['someKey'])  // 清除除 someKey 和默认排除项外的所有缓存
   */
  